草庐IT

c++ - constexpr 和 ODR

全部标签

c++ - 如何使用 QtCreator 调试 DLL 项目?

我已经使用QtCreatorIDE编写了一个用mingw编译的非QtCDLL。当我将DLL注入(inject)进程时,DLL导致该进程在特定代码行崩溃。通过使用OutputDebugString,我发现这一行是罪魁祸首。我知道如何修复该行,并且当该行被修改时DLL可以工作。但是,为了学习如何使用调试器,我保留了未修改的断行。我如何使用QtCreator调试器找到导致问题的同一行?当QtCreator设置为Debug模式编译时,按F5会出现如下对话框,因为没有EXE: 最佳答案 解决方案是在注入(inject)DLL之前运行附加到可执

c++ - gcc 是否有 pragma 来定义文件类型/编译器?

GCC根据文件扩展名(.c、.cc)、命令行参数(-x)或直接调用适当的编译器(比如g++而不是gcc)自动在编译器之间切换。有什么方法可以在文件中使用pragma来覆盖这些吗?评论后更新:我正在将当前50/50C和C++的代码库转换为完全使用C++编译器编译。这是为了允许当前的“C”模块调用我无法更改(并且不想包装)的新C++基础。对于真正是C的文件,我想将扩展名保留为.c,即使它们现在具有C++链接。我认为将它们保留为“.c”表明它们为何如此(我在这里考虑后代!;-))但是更改构建系统以适应每个更改的C文件名也是一项艰巨的工作。更糟糕的是,C文件的一小部分不会正常地转换为C++,所

c++ - 扭曲如何与原子操作一起工作?

warp中的线程在物理上并行运行,所以如果其中一个(称为线程X)启动原子操作,其他线程会做什么?等待?这是否意味着,当线程X被推送到原子队列时,所有线程都将等待,获取访问权限(互斥锁)并使用内存做一些事情,内存受到该互斥锁的保护,然后才是真正的互斥锁?有没有办法让其他线程进行某些工作,比如读取一些内存,这样原子操作会隐藏它的延迟?我的意思是,有15个空闲线程......我猜不太好。Atomic真的很慢,是吗?我怎样才能加速它?有什么模式可以使用它吗?共享内存的原子操作是否锁定银行或整个内存?例如(没有互斥量),有__shared__floatsmem[256];线程1运行atomicA

c++ - 为什么两次比较 char 变量比一次比较 short 变量更快

我认为一次比较一定比两次比较快。但是经过我的测试,我发现在debug模式下shortcompare要快一点,而在release模式下charcompare要快一些。我想知道真正的原因。以下是测试代码和测试结果。我写了两个简单的函数,func1()使用两个字符比较,func2()使用一个短比较。主函数返回临时返回值以避免编译优化忽略我的测试代码。我的编译器是GCC4.7.2,CPUIntel®Xeon®CPUE5-24300@2.20GHz(VM)。inlineintfunc1(unsignedcharword[2]){if(word[0]==0xff&&word[1]==0xff)re

c++ - 如何在C语言中检测环绕计数器和大负值之间的区别

为我的愚蠢道歉,因为这是我在这个论坛上的第一篇文章。我试图在以下代码的帮助下检测环绕无符号32位计数器和大型负跳转之间的区别,但编译器给我错误:错误:由于数据类型的范围有限,比较始终为真[-Werror=type-limits]这是我的代码片段:#defineMAX_BACKWARD_JUMP-4294959295//UINT_MAX-8000#defineMIN_BACKWARD_JUMP-3600#defineMAX_FORWARD_JUMP4800000signedintrtpDelta;//Signed32-bitunsignedintcurrRTPTs,prevRTPTs;/

c++ - 打开 Mp 嵌套并行

所以我有两个内部平行区域的外部平行区域。是否可以将2个线程放入外部平行线,将4个线程放入每个内部平行线?我做了这样的东西,但它似乎无法按照我想要的方式工作。有什么建议吗?start_r=omp_get_wtime();omp_set_nested(1);omp_set_num_threads(2);#pragmaompparallel{printf("Thread%dexecutestheouterparallelregion\n",omp_get_thread_num());omp_set_num_threads(4);#pragmaompparellelforprivate(i,j

c++ - constexpr 计算量的实际限制

作为实验,我只是将一些代码放在一起生成一个std::array在编译时。表内容本身是一个相当典型的CRC查找表-唯一的新事物是使用constexpr计算条目的函数,而不是将自动生成的魔法表直接放在源代码中。无论如何,这个练习让我感到好奇:编译器愿意为评估constexpr计算的计算量是否有任何实际限制?编译时的函数或变量定义?例如类似于gcc的-ftemplate-depth参数创建对模板元编程评估量的实际限制。(我还想知道参数包的长度是否存在实际限制-这会限制使用std::array中间对象创建的编译时std::integer_sequence的大小。)

c++ - 用于提高中间浮点计算精度的编译器标志

gcc/clang中是否有指定中间浮点计算精度的标志?假设我有一个C代码doublex=3.1415926;doubley=1.414;doublez=x*y;是否有一个编译器标志允许以用户机器的最高可能精度计算'x*y',比如说,long-double(64位尾数),然后截断回double(53位)尾数,声明变量类型的精度)?仅供引用,我在64位机器上使用Ubuntu14.04。 最佳答案 海湾合作委员会[编辑观察到的gcc4.8.4行为,其中默认行为与文档相反]您需要使用x87FPU中的80位寄存器。使用-mfpmath=387

c++ - GCC 错误 - 在 constexpr 中输入/递减数组访问

我在GCC6和7(不在GCC5)中的constexpr函数中发现了一个错误,如果函数在编译时(错误结果)或运行时(正确结果)求值,这会导致不同的结果。#includeconstexprintbar(int*b){inti=0;b[i++]=1;//GCCproducehereanfailure.return0;}constexprintfoo(){inttmp[]={0};bar(tmp);returntmp[0];}constexprintcexprI=foo();intmain(){std::coutLiveExample问题是数组访问内部的递增(也发生递减)操作。常量表达式的编译

c++ - 与枚举的隐式转换

这是一个基本问题,我希望轻松地谷歌一下,但没有找到答案。假设我有一个枚举:enumabc{a,b,c};支持哪些隐式转换?编译器之间是否有任何编译器扩展或不同行为?我问的是关于到枚举的隐式转换:enumabctest=(**whichtypecanappearhere?**);以及从枚举的隐式转换:(**whichtypecanappearhere?**)test2=test;我想知道C和C++的答案。 最佳答案 正如引用所说:Valuesofunscopedenumerationtypeareimplicitly-converti